package com.omg.server.util;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 反射工具类.
 * 
 * 提供访问私有变量,获取泛型类型Class, 提取集合中元素的属性, 转换字符串到对象等Util函数.
 * 
 */
public class ReflectUtil {

	private static final Log logger = LogFactory.getLog(ReflectUtil.class);

	public static void setFieldValue(Object target, String fname, Class ftype, Object fvalue) {
		if ((target == null)|| (fname == null) || ("".equals(fname)) || ((fvalue != null) 
				&& (!ftype.isAssignableFrom(fvalue.getClass())))) {
			return;
		}

		Class clazz = target.getClass();
		try {
			Method method = clazz.getDeclaredMethod("set" + Character.toUpperCase(fname.charAt(0)) + fname.substring(1), new Class[] { ftype });
			if (!Modifier.isPublic(method.getModifiers())) {
				method.setAccessible(true);
			}

			method.invoke(target, new Object[] { fvalue });
		}
		catch (Exception me) {
			if (logger.isDebugEnabled()){
				logger.error(me);
			}
			try {
				Field field = clazz.getDeclaredField(fname);
				if (!Modifier.isPublic(field.getModifiers())) {
					field.setAccessible(true);
				}
				field.set(target, fvalue);
			} 
			catch (Exception fe) {
				if (logger.isDebugEnabled()){
					logger.error(fe);
				}
			}
		}
	}

}
